package com.zp.self.module.level_4_算法练习.数据结构.String;

/**
 * @author By ZengPeng
 */
public class 力扣_415_字符串相加 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_415_字符串相加().addStrings("11","123"));
        System.out.println(new 力扣_415_字符串相加().addStrings("456","77"));
        System.out.println(new 力扣_415_字符串相加().addStrings("0","0"));
    }

    /**
     * 题目：给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和并同样以字符串形式返回。
     * 你不能使用任何內建的用于处理大整数的库（比如 BigInteger）， 
     * 也不能直接将输入的字符串转换为整数形式。
     *  
     * 示例 1：
     * 输入：num1 = "11", num2 = "123"
     * 输出："134"
     *
     * 示例 2：
     * 输入：num1 = "456", num2 = "77"
     * 输出："533"
     *
     * 分析：【Good】
     *      1.从后向前，记录是否进位
     *      对比找到不足:   1.不应该转toCharArray 浪费内存
     *                      2.一个变量记录位的和，最后转换为是否进位即可
     *                      3.char 的字符数字 ，例如‘1’==49  转为数字-‘0’ 即可得到：1
     *
     * 边界值 & 注意点：
     *      1.
     **/
    public String addStrings(String num1, String num2) {

        //大佬的：简洁干练
//        StringBuilder sb = new StringBuilder();
//        int carry = 0, i = num1.length()-1, j = num2.length()-1;
//        while(i >= 0 || j >= 0 || carry != 0){
//            if(i>=0) carry += num1.charAt(i--)-'0';
//            if(j>=0) carry += num2.charAt(j--)-'0';
//            sb.append(carry%10);
//            carry /= 10;
//        }
//        return sb.reverse().toString();

        //自己写的 --垃圾东西
        int carry = 0;
        int c1Index = num1.length()-1,c2Index = num2.length()-1;
        StringBuilder res =new StringBuilder();
        while (c1Index>=0 || c2Index>=0 || carry>0){
            if(c1Index>=0) carry += num1.charAt(c1Index--)-'0';
            if(c2Index>=0) carry += num2.charAt(c2Index--)-'0';
            res.append(carry%10);
            carry = carry/10;
        }
        return  res.reverse().toString();
    }
}
